/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//
/////////////////////////////////////////////////
/// \file System.h Ce fichier contient les fonctions système
/////////////////////////////////////////////////
#ifndef CSLP_SYSTEM_HEADER
#define CSLP_SYSTEM_HEADER

#ifdef __cplusplus
extern "C" {
#endif

/////////////////////////////////////////////////
// Headers
/////////////////////////////////////////////////

#ifdef WIN32
	#include <windows.h>
	///////////////////////////////////////////////////
	/// Type permettant de stocker l'identifiant du thread
	/// \sa CSLP_ThreadCreate()
	///////////////////////////////////////////////////
	typedef HANDLE CSLP_THREAD;
#else
	#include <sys/types.h>
	///////////////////////////////////////////////////
	/// Type permettant de stocker l'identifiant du thread
	/// \sa CSLP_ThreadCreate()
	///////////////////////////////////////////////////
	typedef pthread_t CSLP_THREAD;
#endif

///////////////////////////////////////////////////////////
/// Endore le processus pendant une durée donnée
///
/// \param ms le nombre de milisecondes pendant lequel le programme sera
/// endormis
///
///////////////////////////////////////////////////////////
void CSLP_Sleep(int ms);

///////////////////////////////////////////////////////////
/// Permet la création de thread.
/// La fonction thread est directement lancée 
/// lors de l'appelle à cette fonction.
///
/// \param thread le thread qui sera créé (doit être alloué)
/// \param func la fonction exécuté comme thread
/// \param arg les arguments de la fonction
/// \return 0 en cas de succès, une autre valeur en cas d'échec.
/// \sa CSLP_ThreadWait(), CSLP_ThreadClose()
///
///////////////////////////////////////////////////////////
int CSLP_ThreadCreate(CSLP_THREAD* thread, void* func, void* arg);

///////////////////////////////////////////////////////////
/// Permet d'attendre la fin d'exécution du thread
/// 
/// \param thread l'identifiant du thread à attendre
/// \sa CSLP_ThreadCreate(), CSLP_ThreadClose()
///
///////////////////////////////////////////////////////////
void CSLP_ThreadWait(CSLP_THREAD thread);

///////////////////////////////////////////////////////////
/// Permet de forcer la fermeture du thread.\n
/// Attention les ressources allouées par le thread ne seront pas
/// libérées. Il est préférable d'utiliser CSLP_ThreadWait().
///
/// \param thread l'identifiant du thread à tuer
/// \sa CSLP_ThreadCreate(), CSLP_ThreadWait()
///
///////////////////////////////////////////////////////////
void CSLP_ThreadClose(CSLP_THREAD thread);

#ifdef __cplusplus
}
#endif

#endif
